/**
 * @file Tool.hpp
 *
 * @date 15/12/2011
 * @author Tales 
 *
 */

#ifndef _CONTROLLER_TOOL_HPP
#define _CONTROLLER_TOOL_HPP

#include <utility>
#include <bitset>
#include "StateIndex.hpp"

namespace yep
{
using namespace std;

class Editor;
class Picture;

/**
 * @brief Representa uma ferramenta.
 */
class Tool
{
public:

	/**
	 * @brief Construtor
	 */
	Tool();
	/**
	 * @brief Destrutor
	 */
	virtual ~Tool();

	/**
	 * @brief Chamado quando a ferramenta é selecionada
	 */
	virtual void start() =0;

	/**
	 * @brief Chamado quando a ferramenta é "descelecionada".
	 */
	virtual void end() = 0;

	/**
	 * @brief Chamado quando um botão é pressionado.
	 *
	 * @param pos a Posição onde ocorreu o event. Deve ser relativa apenas à area de desenho.
	 * @param leftButton @b true se o botão esquerdo foi pressionado, @b false se for o direito.
	 *  Outros botões são ignorados, pois são reservados para a interface
	 * @param state O estado dos botões e modificadores, conforme StateIndex.
	 */
	virtual void pressed(pair<int, int> pos, bool leftButton, bitset<5> state) = 0;

	/**
	 * @brief Chamado quando um botão é solto.
	 *
	 * @param pos a Posição onde ocorreu o event. Deve ser relativa apenas à area de desenho.
	 * @param leftButton @b true se o botão esquerdo foi solto, @b false se for o direito.
	 *  Outros botões são ignorados, pois são reservados para a interface
	 * @param state O estado dos botões e modificadores, conforme StateIndex.
	 */
	virtual void released(pair<int, int> pos,bool leftButton, bitset<5> state) = 0;

	/**
	 * @brief Chamado quando o mouse é movido.
	 * @param pos A posição atual
	 * @param offset O deslocamento que foi feito desde a posição anterior para a atual.
	 * @param state O estado dos botões e modificadores
	 */
	virtual void moved(pair<int, int> pos, pair<int, int> offset, std::bitset<5> state) = 0;

	/**
	 * @brief Modifica o editor atual.
	 * @param editor O editor sempre deve ser um válido. Deve-se chamar esta operação antes de qualquer outra.
	 */
	void setEditor(Editor &editor);
protected:

	/**
	 * @brief Retorna o editor atual.
	 *
	 * Geralmente os editores são definidos logo após a criação logo presume-se quando este método for chamado,
	 * é impossível o editor seja nulo.
	 * @return uma @b referência ao editor.
	 */
	Editor &getEditor() const;

	/**
	 * @brief Retorna a Picture onde deve-se desenhar.
	 * @return Referência para Picture
	 */
	Picture &getPicture();
private:
	Editor *editor;
};

} /* namespace yep */
#endif /* _CONTROLLER_TOOL_HPP */
